================================================================================
DIAGRAM ALUR GENERATE VOUCHER AGENT
================================================================================

1. ALUR LENGKAP (OVERVIEW)
===========================

┌─────────────────────────────────────────────────────────────────────────┐
│                         GENERATE VOUCHER AGENT                          │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────┐
    │ ADMIN LOGIN  │ ← HARUS LOGIN DULU!
    │  MikhMon     │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │  Koneksi ke  │
    │  MikroTik    │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Session      │ ← Session disimpan di config.php
    │ MikroTik     │
    │ Aktif        │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ AGENT LOGIN  │
    │  Panel       │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Pilih        │
    │ Profile &    │
    │ Quantity     │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Cek Saldo    │ ← Saldo cukup?
    │ Agent        │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Generate     │ ← randNULC(8)
    │ Username &   │   randNULC(6)
    │ Password     │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Add User ke  │ ← Menggunakan session admin
    │ MikroTik     │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Potong Saldo │ ← Saldo - harga beli
    │ Agent        │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Simpan ke    │ ← agent_vouchers
    │ Database     │   agent_transactions
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ Kirim        │ ← Opsional
    │ WhatsApp     │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │ VOUCHER      │ ✅ BERHASIL!
    │ BERHASIL     │
    └──────────────┘

================================================================================

2. ALUR KONEKSI MIKROTIK
=========================

┌─────────────────────────────────────────────────────────────────────────┐
│                      KONEKSI MIKROTIK (DETAIL)                          │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────┐
    │ Admin Login  │
    └──────┬───────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Input IP, Username, Password         │
    │ MikroTik                             │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ RouterosAPI::connect()               │
    │ - IP: 103.175.238.126:8700          │
    │ - User: alijaya                      │
    │ - Pass: (encrypted)                  │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Session disimpan di config.php       │
    │ $data['ALIJAYA-NET'] = array(...)    │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Agent menggunakan session ini        │
    │ $iphost = explode('!', $data[...])   │
    │ $userhost = explode('@|@', ...)      │
    │ $passwdhost = explode('#|#', ...)    │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ $API->connect($iphost, $userhost,    │
    │               decrypt($passwdhost))  │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ KONEKSI BERHASIL ✅                  │
    │ Agent bisa generate voucher          │
    └──────────────────────────────────────┘

================================================================================

3. ALUR GENERATE USERNAME & PASSWORD
=====================================

┌─────────────────────────────────────────────────────────────────────────┐
│                   GENERATE USERNAME & PASSWORD                          │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────┐
    │ Include routeros_api.class.php       │
    │ (Berisi fungsi randNULC, dll)        │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ $username = 'AG' . randNULC(8);      │
    │                                      │
    │ randNULC(8) menghasilkan:            │
    │ - 8 karakter random                  │
    │ - Kombinasi: angka + huruf besar +   │
    │              huruf kecil             │
    │ - Contoh: 2aB3cD5e                   │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Username = AG2aB3cD5e                │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ $password = randNULC(6);             │
    │                                      │
    │ randNULC(6) menghasilkan:            │
    │ - 6 karakter random                  │
    │ - Kombinasi: angka + huruf besar +   │
    │              huruf kecil             │
    │ - Contoh: 5xY7zC                     │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Password = 5xY7zC                    │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ $comment = 'Agent-' .                │
    │            $agentData['agent_code'] .│
    │            '-' . date('d.m.y');      │
    │                                      │
    │ Comment = Agent-AG001-28.10.25       │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ SIAP UNTUK ADD KE MIKROTIK ✅        │
    └──────────────────────────────────────┘

================================================================================

4. ALUR ADD USER KE MIKROTIK
=============================

┌─────────────────────────────────────────────────────────────────────────┐
│                      ADD USER KE MIKROTIK                               │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────┐
    │ $API->comm("/ip/hotspot/user/add",   │
    │   array(                             │
    │     "server" => "all",               │
    │     "name" => "AG2aB3cD5e",          │
    │     "password" => "5xY7zC",          │
    │     "profile" => "1Jam",             │
    │     "comment" => "Agent-AG001-..."   │
    │   )                                  │
    │ );                                   │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ MikroTik API menerima request        │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ MikroTik membuat user baru:          │
    │ - Server: all                        │
    │ - Name: AG2aB3cD5e                   │
    │ - Password: 5xY7zC                   │
    │ - Profile: 1Jam                      │
    │ - Comment: Agent-AG001-28.10.25      │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ USER BERHASIL DIBUAT DI MIKROTIK ✅  │
    └──────────────────────────────────────┘

================================================================================

5. ALUR POTONG SALDO & SIMPAN DATABASE
=======================================

┌─────────────────────────────────────────────────────────────────────────┐
│                  POTONG SALDO & SIMPAN DATABASE                         │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────┐
    │ Cek saldo agent                      │
    │ Saldo: Rp 10.000                     │
    │ Harga beli: Rp 2.000                 │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Saldo cukup? ✅                      │
    │ 10.000 >= 2.000 → OK                 │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ $agent->deductBalance(               │
    │   agent_id,                          │
    │   2000,                              │
    │   '1Jam',                            │
    │   'AG2aB3cD5e',                      │
    │   'Generate voucher: AG2aB3cD5e'     │
    │ );                                   │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ UPDATE agent_system                  │
    │ SET balance = balance - 2000         │
    │ WHERE agent_id = ...                 │
    │                                      │
    │ Saldo baru: Rp 8.000                 │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ INSERT INTO agent_transactions       │
    │ - agent_id                           │
    │ - type: 'deduct'                     │
    │ - amount: 2000                       │
    │ - description: 'Generate voucher...' │
    │ - created_at: NOW()                  │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ INSERT INTO agent_vouchers           │
    │ - agent_id                           │
    │ - transaction_id                     │
    │ - username: 'AG2aB3cD5e'             │
    │ - password: '5xY7zC'                 │
    │ - profile_name: '1Jam'               │
    │ - buy_price: 2000                    │
    │ - sell_price: 3000                   │
    │ - customer_phone: '08123456789'      │
    │ - customer_name: 'Test Customer'     │
    │ - sent_via: 'web'                    │
    │ - created_at: NOW()                  │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ SALDO TERPOTONG & DATA TERSIMPAN ✅  │
    └──────────────────────────────────────┘

================================================================================

6. ALUR KIRIM WHATSAPP (OPSIONAL)
==================================

┌─────────────────────────────────────────────────────────────────────────┐
│                       KIRIM WHATSAPP (OPSIONAL)                         │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────┐
    │ User centang "Kirim via WhatsApp"?   │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Skip WhatsApp
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ Nomor WhatsApp diisi?                │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Skip WhatsApp
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ include('whatsapp_config.php')       │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ sendVoucherNotification(             │
    │   '08123456789',                     │
    │   [                                  │
    │     'hotspot_name' => 'MikhMon',     │
    │     'profile' => '1Jam',             │
    │     'username' => 'AG2aB3cD5e',      │
    │     'password' => '5xY7zC',          │
    │     'price' => 'Rp 3.000',           │
    │     'login_url' => 'http://...'      │
    │   ]                                  │
    │ );                                   │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ WhatsApp Gateway API                 │
    │ (Fonnte / WooWA / dll)               │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ Pesan terkirim ke customer:          │
    │                                      │
    │ 🎫 VOUCHER WIFI MIKHMON              │
    │ ━━━━━━━━━━━━━━━━━━━━━━━━            │
    │ Paket: 1Jam                          │
    │ Username: AG2aB3cD5e                 │
    │ Password: 5xY7zC                     │
    │ Harga: Rp 3.000                      │
    │                                      │
    │ Login: http://hotspot.com/login      │
    └──────┬───────────────────────────────┘
           │
           ▼
    ┌──────────────────────────────────────┐
    │ WHATSAPP TERKIRIM ✅                 │
    └──────────────────────────────────────┘

================================================================================

7. ALUR ERROR HANDLING
=======================

┌─────────────────────────────────────────────────────────────────────────┐
│                         ERROR HANDLING                                  │
└─────────────────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────┐
    │ Session MikroTik ada?                │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Error: "Session MikroTik tidak ditemukan"
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ Harga profile sudah diset?           │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Error: "Harga untuk profile ini belum diset"
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ Saldo agent cukup?                   │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Error: "Saldo tidak mencukupi"
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ Koneksi MikroTik berhasil?           │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Error: "Gagal terhubung ke MikroTik"
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ Add user ke MikroTik berhasil?       │
    └──────┬───────────────────────────────┘
           │
           ├─── NO ──→ Error: "Gagal generate voucher"
           │
           └─── YES ──┐
                      ▼
    ┌──────────────────────────────────────┐
    │ GENERATE BERHASIL ✅                 │
    └──────────────────────────────────────┘

================================================================================

8. DIAGRAM DATABASE
===================

┌─────────────────────────────────────────────────────────────────────────┐
│                         DATABASE STRUCTURE                              │
└─────────────────────────────────────────────────────────────────────────┘

    agent_system
    ├── agent_id (PK)
    ├── agent_code (AG001)
    ├── name
    ├── username
    ├── password
    ├── phone
    ├── balance (Rp 10.000 → Rp 8.000)
    ├── status (active)
    └── created_at

    agent_transactions
    ├── transaction_id (PK)
    ├── agent_id (FK → agent_system)
    ├── type (deduct)
    ├── amount (2000)
    ├── description (Generate voucher: AG2aB3cD5e)
    ├── balance_before (10000)
    ├── balance_after (8000)
    └── created_at

    agent_vouchers
    ├── voucher_id (PK)
    ├── agent_id (FK → agent_system)
    ├── transaction_id (FK → agent_transactions)
    ├── username (AG2aB3cD5e)
    ├── password (5xY7zC)
    ├── profile_name (1Jam)
    ├── buy_price (2000)
    ├── sell_price (3000)
    ├── customer_phone (08123456789)
    ├── customer_name (Test Customer)
    ├── sent_via (web/whatsapp)
    ├── status (active)
    └── created_at

    agent_prices
    ├── price_id (PK)
    ├── agent_id (FK → agent_system)
    ├── profile_name (1Jam)
    ├── buy_price (2000)
    ├── sell_price (3000)
    └── created_at

================================================================================

KESIMPULAN:
===========

Alur generate voucher agent sekarang mengikuti PERSIS cara MikhMon admin:
1. ✅ Menggunakan session MikroTik dari admin
2. ✅ Generate username/password dengan fungsi MikhMon (randNULC)
3. ✅ Koneksi langsung ke MikroTik (tidak pakai API bridge)
4. ✅ Error handling yang baik
5. ✅ Simpan ke database dengan lengkap

Cara ini sudah TERBUKTI BERHASIL di MikhMon admin!

================================================================================
